home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / listings / v_12_12 / saks / queue9.h < prev    next >
C/C++ Source or Header  |  1994-10-05  |  2KB  |  104 lines

  1. Listing 1 - a template for a queue with element of type T using nested 
  2. classes
  3.  
  4. //
  5. // queue9.h - a template for a queue class
  6. // with a nested private cell class
  7. // and a nested public iterator class
  8. //
  9.  
  10. //
  11. // the "declare" part
  12. //
  13. template <class T>
  14. class queue
  15.     {
  16. private:
  17.     struct cell
  18.         {
  19.         cell *next;
  20.         T element;
  21.         cell(const T &e, cell *p)
  22.             : element(e), next(p) { }
  23.         };
  24.     cell *first, *last;
  25. public:
  26.     queue();
  27.     ~queue();
  28.     void append(const T &e);
  29.     void clear();
  30.     int remove(T &e);
  31.     class iterator;
  32.     friend class iterator;
  33.     class iterator
  34.         {
  35.     public:
  36.         iterator(const queue<T> &q)
  37.             : pc(q.first) { }
  38.         T *next()
  39.             {
  40.             T *pt = 0;
  41.             if (pc != 0)
  42.                 {
  43.                 pt = &pc->element;
  44.                 pc = pc->next;
  45.                 }
  46.             return pt;
  47.             }
  48.     private:
  49.         cell *pc;
  50.         };
  51.     };
  52.  
  53. template <class T>
  54. inline queue<T>::queue()
  55.     : first(0), last(0)
  56.     {
  57.     }
  58.  
  59. template <class T>
  60. inline queue<T>::~queue()
  61.     {
  62.     clear();
  63.     }
  64.  
  65. //
  66. // the "implement" part
  67. //
  68. template <class T>
  69. void queue<T>::append(const T &e)
  70.     {
  71.     cell *p = new cell(e, 0);
  72.     if (first == 0)
  73.         first = p;
  74.     else
  75.         last->next = p;
  76.     last = p;
  77.     }
  78.  
  79. template <class T>
  80. void queue<T>::clear()
  81.     {
  82.     cell *p;
  83.     while (first != 0)
  84.         {
  85.         p = first;
  86.         first = first->next;
  87.         delete p;
  88.         }
  89.     }
  90.  
  91. template <class T>
  92. int queue<T>::remove(T &e)
  93.     {
  94.     if (first == 0)
  95.         return 0;
  96.     cell *p = first;
  97.     if ((first = first->next) == 0)
  98.         last = 0;
  99.     e = p->element;
  100.     delete p;
  101.     return 1;
  102.     }
  103.  
  104.